#ifndef SS_CMNDEFINE_H_
#define SS_CMNDEFINE_H_

#ifdef WIN32
#pragma pack(push)
#pragma pack(1)
#define Y_RD_PACKED
#else
#define Y_RD_PACKED __attribute__((packed))
#endif

const int MAX_QUOTA_STATUS_LEN = 2;
const int MAX_HQTYPE_LEN = 2;

#define Y_RD_MSG_MAGIC 382923
#define Y_RD_APPEND_ADDR_LEN 30
#define Y_RD_SERVICE_MESSAGE_BLOCK_LEN 2048 * 20
#define Y_RD_AES_KEY_LEN 16
#define Y_RD_AES_KEY_LOGIN "jwxop71#t(mk9h_i"

#define Y_RD_AES_BLOCK_LEN 16
#define Y_RD_RECV_TIME_OUT 1000000

#ifndef Y_RD_USERNAME_LEN
#define Y_RD_USERNAME_LEN 32 + 1
#define Y_RD_USERID_LEN 10
#define Y_RD_PASSWD_LEN 32 + 1
#define Y_RD_COUNTER_LEN 16
#define Y_RD_COOKIE_LEN 21
#define Y_RD_HOST_LEN 64  // 支持域名

#define Y_RD_DATE_LEN 8
#define Y_RD_TIME_LEN 6
#define Y_RD_DATETIME_LEN 24
#define Y_RD_RESERVE_LEN 20
#endif  // Y_RD_USERNAME_LEN

namespace qb {

enum _eRetCode_t {
  E_RC_OK = 0,                // 成功
  E_RC_DUPLOGIN = 1,          // 重复登录
  E_RC_PASSWD_ERR = 2,        // 密码错误
  E_RC_USER_ERR = 3,          // 用户不存在
  E_RC_NOLOGIN = 4,           // 未登陆,找不到网关
  E_RC_ERROR = 5,             // 失败
  E_RC_VERSION_CHECK = 6,     // 有新版本
  E_RC_IP_CHECK = 7,          // IP检查失败
  E_RC_CONN_ERR = 8,          // 连接失败
  E_RC_COOKIE_ERR = 9,        // 失败
  E_RC_NODATA = 10,           // 无对应数据
  E_RC_MAC_CHECK = 11,        // Mac校验失败
  E_RC_EXPIRED_USER = 12,     // 过期
  E_RC_IP_IN_BLACKLIST = 13,  // IP在黑名单
  E_RC_NEED_RELOGIN = 14,     // 需要重新登录
  E_RC_TIMEOUT = 15,          // 登录超时，需要重登
  E_RC_NOSERVERLIST = 16      // 未读取到服务器配置

};

enum MaxLen {
  MaxLenAddress = 256,
  MaxLenUser = 128,
  MaxLenPasswd = 128,
};

enum ConnectionError {
  E_SUCCESS = 0,                    // 成功
  E_PROXY_CANNOT_CONNECT = 1001,    // 不能连接到代理服务器
  E_PROXY_SOCKS_CONNECT_FAIL,       // 不能建立SOCKS连接
  E_PROXY_SOCKS_AUTH_FAIL,          // SOCKS用户验证失败
  E_PROXY_HTTP_VERSION_ERR,         // HTTP协议版本不匹配
  E_PROXY_HTTP_AUTH_FAIL,           // HTTP验证失败	407
  E_PROXY_HTTP_SERVER_UNAVAILABLE,  // HTTP服务器不可用 5xx
  E_PROXY_HOST_CONNECT_FAIL,  // 不能通过代理服务器连接目标主机
  E_HOST_CONNECT_FAIL,        // 不能直接连接目标主机
  E_PROXY_NETWORK_TIMEOUT,    // 网络超时（若干秒内收不到数据）
  E_SEND_TESTMSG_FAIL,        // 发送测试连接消息失败
  E_RECV_TESTMSG_FAIL,        // 接收测试连接消息失败
  E_RECV_EOF,                 // ACE::OS Recv返回0，中断连接
  E_TESTCONNECT_READSERVER_FAIL,  // 读取服务器配置失败
  E_SEND_RTTMSG_FAIL,             // 发送网络测速包失败
  E_RECV_RTTMSG_FAIL              // 接收网络测速包失败
};

enum ProxyType2 {
  TypeNone = 0,
  TypeSocks4 = 1,
  TypeSocks5 = 2,
  TypeHTTPS = 3,
  TypeIE = 4,
  TypeHTTP
};

enum _eAutoLgnFlag {
  E_UPDATE_DEFAULT = 0,   // 静默升级
  E_UPDATE_AUTO = 1,      // 1--自动更新
  E_UPDATE_IGNORE = 2,    // 2--不提示更新,禁止升级
  E_UPDATE_FORCE = 3,     // 3--强制更新
  E_UPDATE_OVERRIDE = 4,  // 覆盖,add XW20141223

  E_LASTEST_UPDATE_DEFAULT = 1000,   // 最新版静默升级
  E_LASTEST_UPDATE_AUTO = 1001,      // 最新版自动更新
  E_LASTEST_UPDATE_FORCE = 1003,     // 最新版强制升级
  E_LASTEST_UPDATE_OVERRIDE = 1004,  // 最新版覆盖升级
};

struct _xMsgHeadReq_t {
  int msgtype;  // 消息类型，即功能编号
} Y_RD_PACKED;
typedef struct _xMsgHeadReq_t xMsgHeadReq_t;

struct _xMsgHeadAck_t {
  int msgtype;    // 消息类型，即功能编号
  short retcode;  // 标志 : 0 成功，非0 失败
  char desc[20];  // 描述
  short num;
  short idx;
  short records;  // 当前包的记录数
} Y_RD_PACKED;
typedef struct _xMsgHeadAck_t xMsgHeadAck_t;

}  // namespace qb

#ifdef WIN32
#pragma pack(pop)
#endif
#endif
